#include "linearsearch.h"

// 构造函数：初始化查找状态并构建可视化数据条（灰色）
LinearSearch::LinearSearch(const QVector<int>& values)
    : current(0), target(-1), found(false), finished(false), foundIndex(-1), compareCount(0) {
    for (int v : values)
        bars.append({v, Qt::lightGray});  // 初始化每个元素为默认灰色
}

// 每次调用 step() 只比较一个元素，并更新颜色状态
void LinearSearch::step() {
    // 如果已经完成或越界，结束查找
    if (finished || current >= bars.size()) {
        finished = true;
        return;
    }

    // 每步开始前重置所有颜色为灰色
    for (auto& bar : bars)
        bar.color = Qt::lightGray;

    // 当前比较元素设为红色
    bars[current].color = Qt::red;
    compareCount++;

    // 判断当前元素是否为目标值
    if (bars[current].value == target) {
        bars[current].color = Qt::green;  // 找到目标值，标记为绿色
        found = true;
        foundIndex = current;
        finished = true;
        return;
    }

    // 未找到则移动到下一个元素
    current++;
    if (current >= bars.size())
        finished = true;  // 到达末尾也未找到，查找结束
}

// 是否完成查找
bool LinearSearch::isFinished() const {
    return finished;
}

// 获取当前所有数据条（用于更新图表）
const QVector<SortBar>& LinearSearch::getData() const {
    return bars;
}

// 设置要查找的目标值
void LinearSearch::setTarget(int value) {
    target = value;
}

// 查找是否成功
bool LinearSearch::isFound() const {
    return found;
}

// 返回目标值的索引（若查找到）
int LinearSearch::getFoundIndex() const {
    return foundIndex;
}

// 返回该算法的描述信息
QString LinearSearch::getDescription() const {
    return "线性查找：从左到右一个个查找目标值，最坏情况是查到最后。";
}

// 返回当前步骤的比较次数并重置计数器
int LinearSearch::getAndResetCompareCount() {
    int c = compareCount;
    compareCount = 0;
    return c;
}
